package com.tituaem.operacionesBd;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.tituaem.conexionBd.ConexionSqlite;
import com.tituaem.presentacion.Alumno;
import com.tituaem.presentacion.Presentacion;
import com.tituaem.presentacion.Proyecto;
import com.tituaem.utilityclass.Administrador;

public class Consultas extends ConexionSqlite {

    Connection con;

    //Contructores
    public Consultas(Connection con) {
        this.con = con;
    }

    public Consultas() throws ClassNotFoundException, SQLException {
        this.con = super.loadConnection();
    }

    //metodos
    public Connection getCon() {
        return con;
    }

    public ArrayList<String> obtenerNombresLicenciaturas() throws SQLException {
        ArrayList<String> nomLic = new ArrayList<String>();
        Statement stmLicenciaturas = con.createStatement();
        ResultSet resLicenciaturas = stmLicenciaturas.executeQuery("SELECT NombreLicenciatura From Licenciatura");

        while (resLicenciaturas.next()) {
            nomLic.add(resLicenciaturas.getString(1));
        }

        stmLicenciaturas.close();
        //resLicenciaturas.close();
        return nomLic;

    }

    public ArrayList<String> obtenerNombresLugar() throws SQLException {
        ArrayList<String> nomLugar = new ArrayList<String>();
        Statement stmLugar = con.createStatement();
        ResultSet resLugar = stmLugar.executeQuery("SELECT NombreLugar From Lugar");

        while (resLugar.next()) {
            nomLugar.add(resLugar.getString(1));
            //System.out.println(nomLugar);
        }
        stmLugar.close();
        //resLugar.close();
        return nomLugar;

    }

    public ArrayList<String> obtenerNombresModalidad() throws SQLException {
        ArrayList<String> nombres = new ArrayList<String>();
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT NombreModalidad From Modalidad");

        while (res.next()) {
            nombres.add(res.getString(1));
            //System.out.println(nombres);
        }
        return nombres;
    }

    public String obtenerIdModalidad(String nombre) throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT idModalidad From Modalidad where NombreModalidad==\"" + nombre + "\"");

                //System.out.println(res.getString(1));
        return res.getString(1);
    }

    public String obtenerIdLugar(String nombre) throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT idLugar From Lugar where NombreLugar==\"" + nombre + "\"");

                //System.out.println(res.getString(1));
        return res.getString(1);
    }

    public String obtenerIdLicenciatura(String nombre) throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT idLicenciatura From Licenciatura where NombreLicenciatura==\"" + nombre + "\"");

                //System.out.println(res.getString(1));
        return res.getString(1);
    }

    public String obtenerNombreLicenciatura(String id) throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT NombreLicenciatura From Licenciatura where idLicenciatura==\"" + id + "\"");

                //System.out.println(res.getString(1));
        return res.getString(1);
    }

    public String obtenerNombreModalidad(String id) throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT NombreModalidad From Modalidad where idModalidad==\"" + id + "\"");

                //System.out.println(res.getString(1));
        return res.getString(1);
    }

    public String obtenerNombreLugar(String id) throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT NombreLugar From Lugar where idLugar==\"" + id + "\"");

                //System.out.println(res.getString(1));
        return res.getString(1);
    }
    
    public ResultSet obtenerTablaAlumnos() throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT * FROM Alumnos");
        return res;
    }

    public ArrayList<Alumno> obtenerTodosAlumnos() throws SQLException {
        ArrayList<Alumno> elementos = new ArrayList<Alumno>();
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT * FROM Alumnos");

        while (res.next()) {
            elementos.add(new Alumno(res.getInt(1), res.getString(2), res.getString(3), res.getString(4), res.getString(5)));
        }
        //System.out.println(elementos);
        return elementos;
    }
    
    public ResultSet obtenerTablaProyectos() throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT * FROM Proyecto");
        return res;
    }

    public ArrayList<Proyecto> obtenerTodosProyectos() throws SQLException {
        ArrayList<Proyecto> elementos = new ArrayList<Proyecto>();
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT * FROM Proyecto");

        while (res.next()) {
            elementos.add(new Proyecto(res.getInt(1), res.getString(2), res.getString(3), res.getString(4), res.getString(5), res.getString(6)));
        }
        //System.out.println(elementos);
        return elementos;
    }

    public int obtenerIdProyecto(String titulo, String fecha) throws SQLException {
        ArrayList<Proyecto> elementos = obtenerTodosProyectos();
        int id = 0;

        for (int i = 0; i < elementos.size(); i++) {
            Proyecto p = elementos.get(i);
            if (titulo.equalsIgnoreCase(p.getTitulo())) {
                if (fecha.equalsIgnoreCase(p.getFecha())) {
                    id = p.getIdProyecto();
                }
            }
        }
        return id;

    }

    public int obtenerIdAlumno(String nombre, String apellidoP, String apellidoM) throws SQLException {
        ArrayList<Alumno> elementos = obtenerTodosAlumnos();
        int id = 0;

        for (int i = 0; i < elementos.size(); i++) {
            Alumno p = elementos.get(i);
            if (nombre.equalsIgnoreCase(p.getNombre())) {
                if (apellidoP.equalsIgnoreCase(p.getApellidoP())) {
                    if (apellidoM.equalsIgnoreCase(p.getApellidoM())) {
                        id = p.getIdAlumno();
                    }
                }
            }
        }
        return id;

    }

    public Proyecto obtenerProyectoPorId(int id) throws SQLException {
        ArrayList<Proyecto> elementos = obtenerTodosProyectos();
        Proyecto ret = null;

        for (int i = 0; i < elementos.size(); i++) {
            Proyecto p = elementos.get(i);
            if (id == p.getIdProyecto()) {
                ret = p;
            }
        }
        return ret;
    }

    public Alumno obtenerAlumnoPorId(int id) throws SQLException {
        ArrayList<Alumno> elementos = obtenerTodosAlumnos();
        Alumno ret = null;

        for (int i = 0; i < elementos.size(); i++) {
            Alumno p = elementos.get(i);
            if (id == p.getIdAlumno()) {
                ret = p;
            }
        }
        return ret;
    }

    public boolean estaElAlumno(String nombre, String apP, String apM) throws SQLException {
        ArrayList<Alumno> elementos = obtenerTodosAlumnos();
        boolean esta = false;

        for (int i = 0; i < elementos.size(); i++) {
            Alumno o = elementos.get(i);

            if (nombre.equalsIgnoreCase(o.getNombre())) {
                if (apP.equalsIgnoreCase(o.getApellidoP())) {
                    if (apM.equalsIgnoreCase(o.getApellidoM())) {
                        esta = true;
                    }
                }
            }
        }

        return esta;

    }

    public ResultSet obtenerTablaAlumnosProyecto() throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT * FROM AlumnoProyecto");

        return res;
    }

    public ArrayList<Presentacion> obtenerTodasPresentacionesSinPulir() throws SQLException {
        ResultSet res = this.obtenerTablaAlumnosProyecto();
        ArrayList<Presentacion> pres = new ArrayList<Presentacion>();

        while (res.next()) {
            Alumno a = this.obtenerAlumnoPorId(res.getInt(1));
//                System.out.println(a);
            Proyecto p = this.obtenerProyectoPorId(res.getInt(2));
//                System.out.println(p);
            Presentacion pre = new Presentacion(p.getTitulo(), p.getModalidad(), a.getNombre(), a.getApellidoP(), a.getApellidoM(), a.getLicenciatura(), p.getFecha(), p.getHora(), p.getLugar());

            pres.add(pre);

        }
        Collections.sort(pres);
        return pres;
    }

    public ArrayList<Presentacion> obtenerTodasPresentaciones() throws SQLException {
        ResultSet res = this.obtenerTablaAlumnosProyecto();
        ArrayList<Presentacion> pres = new ArrayList<Presentacion>();

        while (res.next()) {
            Alumno a = this.obtenerAlumnoPorId(res.getInt(1));
            Proyecto p = this.obtenerProyectoPorId(res.getInt(2));
            Presentacion pre = new Presentacion(p.getTitulo(), this.obtenerNombreModalidad(p.getModalidad()), a.getNombre(), a.getApellidoP(), a.getApellidoM(), this.obtenerNombreLicenciatura(a.getLicenciatura()), p.getFecha(), p.getHora(), this.obtenerNombreLugar(p.getLugar()));
            pres.add(pre);
        }
        Collections.sort(pres);
        return pres;
    }

    public ArrayList<Presentacion> obtenerPresentacionesFuturasSinPulir() throws SQLException {
        ArrayList<Presentacion> pre = this.obtenerTodasPresentacionesSinPulir();
        ArrayList<Presentacion> preF = new ArrayList<Presentacion>();
        Date fechaActual = new Date();

        for (int i = 0; i < pre.size(); i++) {
            if (fechaActual.compareTo(pre.get(i).getFecha()) > 0) {

            } else {
                if (fechaActual.compareTo(pre.get(i).getFecha()) < 0) {
                    preF.add(pre.get(i));
                } else {
                    preF.add(pre.get(i));
                }

            }

        }
        return preF;
    }

    public ArrayList<Presentacion> obtenerPresentacionesFuturas() throws SQLException {
        ArrayList<Presentacion> pre = this.obtenerTodasPresentaciones();
        ArrayList<Presentacion> preF = new ArrayList<Presentacion>();
        Date fechaActual = new Date();

        for (int i = 0; i < pre.size(); i++) {
            if (fechaActual.compareTo(pre.get(i).getFecha()) > 0) {

            } else {
                if (fechaActual.compareTo(pre.get(i).getFecha()) < 0) {
                    preF.add(pre.get(i));
                } else {
                    preF.add(pre.get(i));
                }

            }

        }
        return preF;
    }

    public ArrayList<Presentacion> obtenerPresentacionesDelMes() throws SQLException {
        ArrayList<Presentacion> pre = this.obtenerPresentacionesFuturas();
        ArrayList<Presentacion> preF = new ArrayList<Presentacion>();
        Date fechaActual = new Date();
        int mesActual = fechaActual.getMonth() + 1;
        for (int i = 0; i < pre.size(); i++) {
            if (mesActual == (pre.get(i).getFecha().getMonth() + 1)) {
                preF.add(pre.get(i));
            }
        }
        //System.out.println(preF);
        return preF;

    }

    public ArrayList<Presentacion> obtenerPresentacionesDelMesSinPulir() throws SQLException {
        ArrayList<Presentacion> pre = this.obtenerPresentacionesFuturasSinPulir();
        ArrayList<Presentacion> preF = new ArrayList<Presentacion>();
        Date fechaActual = new Date();
        int mesActual = fechaActual.getMonth() + 1;
        for (int i = 0; i < pre.size(); i++) {
            if (mesActual == (pre.get(i).getFecha().getMonth() + 1)) {
                preF.add(pre.get(i));
            }
        }
        //System.out.println(preF);
        return preF;

    }

    public ArrayList<Presentacion> obtenerPresentacionesProximasSPHasta(int mesDespues) throws SQLException {
        ArrayList<Presentacion> pre = this.obtenerPresentacionesFuturasSinPulir();
        ArrayList<Presentacion> preF = new ArrayList<Presentacion>();
        Date fechaActual = new Date();
        int mesActual = fechaActual.getMonth() + 1;
        for (int i = 0; i < pre.size(); i++) {
            if (pre.get(i).getFecha().getMonth() <= (mesActual + mesDespues)) {
                preF.add(pre.get(i));
            }
        }
        //System.out.println(preF);
        return preF;
    }

    public ArrayList<Presentacion> obtenerPresentacionesProximasHasta(int mesDespues) throws SQLException {
        ArrayList<Presentacion> pre = this.obtenerPresentacionesFuturas();
        ArrayList<Presentacion> preF = new ArrayList<Presentacion>();
        Date fechaActual = new Date();
        int mesActual = fechaActual.getMonth() + 1;
        for (int i = 0; i < pre.size(); i++) {
            if (pre.get(i).getFecha().getMonth() <= (mesActual + mesDespues)) {
                preF.add(pre.get(i));
            }
        }
        //System.out.println(preF);
        return preF;
    }

    public ArrayList<Presentacion> obtenerPresentacionesEspecificas(String licenciatura) throws SQLException {
        ResultSet res = this.obtenerTablaAlumnosProyecto();
        ArrayList<Presentacion> pres = new ArrayList<Presentacion>();
        while (res.next()) {
            Alumno a = this.obtenerAlumnoPorId(res.getInt(1));
            Proyecto p = this.obtenerProyectoPorId(res.getInt(2));
            if (a.getLicenciatura().equals(licenciatura)) {
                Presentacion pre = new Presentacion(p.getTitulo(), this.obtenerNombreModalidad(p.getModalidad()), a.getNombre(), a.getApellidoP(), a.getApellidoM(), this.obtenerNombreLicenciatura(a.getLicenciatura()), p.getFecha(), p.getHora(), this.obtenerNombreLugar(p.getLugar()));
                pres.add(pre);
            }
        }
        Collections.sort(pres);
        return pres;
    }

    public ResultSet obtenerTablaAdministradores() throws SQLException {
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery("SELECT * FROM Administrador");

        return res;
    }
    
    public ArrayList<Administrador> obtenerTodosAdministradores() throws SQLException{
        ResultSet res=obtenerTablaAdministradores();
        ArrayList<Administrador> elementos=new ArrayList<Administrador>();
        while(res.next()){
            elementos.add(new Administrador(res.getString(1), res.getString(2)));
        }
        return elementos;
    }
    
    public boolean obtenerAdministradorLog(String us, String pass) throws SQLException{
        ArrayList<Administrador> elementos=obtenerTodosAdministradores();
        boolean acc=false;
        for(int i=0; i<elementos.size(); i++){
            Administrador a=elementos.get(i);
            if(us.equals(a.getUsuario())){
                if(pass.equals(a.getPassword())){
                    acc=true;
                }
            }
        }
        return acc;
    }
    
    public int actualizarProyecto(int id, String titProy, String modal, String lugar, String hora, String fecha) throws SQLException{
        Statement st=con.createStatement();
        int acc=0;
        acc=st.executeUpdate("UPDATE Proyecto SET TituloProy='"+titProy+"', Modalidad='"+modal+"', Lugar='"+lugar+"', Hora='"+hora+"', Fecha='"+fecha+"' WHERE _idProyecto="+id);
        return acc;
    }
    
    public int actualizarAlumno(int id, String nom, String app, String apm, String lic) throws SQLException{
        Statement st=con.createStatement();
        int acc=0;
        acc=st.executeUpdate("UPDATE Alumno SET Nombre='"+nom+"', Apellido_Paterno='"+app+"', Apellido_Materno='"+apm+"', _idLicenciatura='"+lic+"' WHERE _idAlumno="+id);
        return acc;
    }
    
    public void closeConecction()
    {
        try {
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(Consultas.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //metodo main para pruebas
//    public static void main(String[] args) {
//        try {
//            Consultas c=new Consultas();
////            c.obtenerTodosAlumnos();
////            c.obtenerPresentacionesDelMesSinPulir();
//            System.out.println(c.obtenerTodasPresentacionesSinPulir());
//            
//        } catch (ClassNotFoundException ex) {
//            Logger.getLogger(Consultas.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (SQLException ex) {
//            Logger.getLogger(Consultas.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }
}
